Use a color matrix for symbolic icons
authorMatthias Clasen <mclasen@redhat.com>
Mon, 23 Oct 2017 07:08:25 +0000 (09:08 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 23 Oct 2017 09:47:17 +0000 (11:47 +0200)
The recoloring of symbolic icons is just a color matrix
operation.

gtk/gtkiconhelper.c

index 5d47954536f55464bf8b8614f5961985efcf23db..7942c1509d75b7c960c950263ee95ef54187520c 100644 (file)
@@ -505,11 +505,7 @@ find_cached_texture (GtkIconHelper *self)
     return NULL;
 
   if (gtk_icon_info_is_symbolic (info))
-    {
-      // FIXME
-      g_object_unref (info);
-      return NULL;
-    }
+      self->rendered_surface_is_symbolic = TRUE;
 
   texture = gtk_icon_info_load_texture (info);
 
@@ -791,6 +787,8 @@ gtk_icon_helper_snapshot (GtkIconHelper *self,
 {
   GtkCssStyle *style;
   GskTexture *texture;
+  graphene_matrix_t matrix;
+  graphene_vec4_t offset;
 
   style = gtk_css_node_get_style (self->node);
 
@@ -798,12 +796,28 @@ gtk_icon_helper_snapshot (GtkIconHelper *self,
   texture = self->texture;
   if (texture == NULL)
     return;
+
+  if (self->rendered_surface_is_symbolic)
+    {
+      GdkRGBA fg, sc, wc, ec;
+
+      gtk_icon_theme_lookup_symbolic_colors (style, &fg, &sc, &wc, &ec);
+
+      graphene_matrix_init_from_float (&matrix, (float[16]) {
+                                         sc.red - fg.red, sc.green - fg.green, sc.blue - fg.blue, 0,
+                                         wc.red - fg.red, wc.green - fg.green, wc.blue - fg.blue, 0,
+                                         ec.red - fg.red, ec.green - fg.green, ec.blue - fg.blue, 0,
+                                         0, 0, 0, fg.alpha
+                                       });
+      graphene_vec4_init (&offset, fg.red, fg.green, fg.blue, 0);
+    }
+
   gtk_css_style_snapshot_icon_texture (style,
                                        snapshot,
                                        texture,
                                        gtk_widget_get_scale_factor (self->owner),
-                                       NULL, NULL);
+                                       self->rendered_surface_is_symbolic ? &matrix : NULL,
+                                       self->rendered_surface_is_symbolic ? &offset : NULL);
 }
 
 gboolean